package Negocios;

import CDB.Categorias;
import CDB.PersonFactory;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;

/**
 *
 * @author ISCErick
 */
public class ControlCategories {

    public SessionFactory sessionFactory = null;

    public ControlCategories() {
    }

    public List selectAll() {
        List list = null;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los empleados
            list = session.createQuery("from Categorias c").list();
            session.close();
            //Retorno la lista con todos los empleados
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return list;
    }

    public Categorias selectOne(int id) {
        Categorias cat = null;
        try {
            Session session = createSession();
            cat = (Categorias) session.createQuery("from Categorias c where c.idcategoria = " + id).list().get(0);
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return cat;
    }

    public boolean categoryExist(String nombre) {
        boolean res = true;
        try {
            Session session = createSession();
            List list = session.createQuery("from Categorias c where c.nombre='" + nombre + "'").list();
            if (list.size() < 1) {
                res = false;
            }
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return res;
    }

    public void add(String nombre, boolean subcategorias) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            Categorias cat = new Categorias();

            //construir el empleado apartir de los datos proporcionados
            cat.setNombre(nombre);
            cat.setSubcategorias(subcategorias);

            //Guardar la el empleado mandado
            session.save(cat);

            //Si no a ocurrido un error 
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
    }

    /**
     *
     * @param nombre
     * @param tieneSubcat
     * @param subcategoria
     */
    public void add(String nombre, boolean tieneSubcat, List subcategorias) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            Categorias cat = new Categorias();

            //construir el empleado apartir de los datos proporcionados
            cat.setNombre(nombre);
            cat.setSubcategorias(tieneSubcat);
            //Guardar la el empleado mandado
            session.save(cat);
            tx.commit();

            //Transaccion para los detalles
            Transaction txD = session.beginTransaction();
            //Obteniendo el id de la ultima categoria obtenida
            cat = getLast();

            //Creando los detalles de Subcategorias
            for (int i = 0; i < subcategorias.size(); i++) {
                ControlSubcategoryDetail csd = new ControlSubcategoryDetail();
                ControlSubcategory cs = new ControlSubcategory();

                //Crear el detalle con la categoria estatica y las subcategorias
                //seleccionadas
                csd.add(cat, cs.selectOne(Integer.parseInt((String) subcategorias.get(i))));
                System.gc();
            }

            //Si no a ocurrido un error 
            txD.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }

    }

    public void update(Categorias categoria, List subcategorias) {
        boolean isSubcategorias = categoria.isSubcategorias();
        if (isSubcategorias) {
            Session session = null;
            if (!categoria.getNombre().equals(selectOne(categoria.getIdcategoria()).getNombre())) {

                try {
                    session = createSession();
                    Transaction transaction = session.beginTransaction();
                    //Operacion hibernate para borrar un registro
                    session.update(categoria);
                    //Si no ocurrio error hago comit y termino la session
                    transaction.commit();
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
                } finally {
                    session.flush();
                    session.close();
                }
            }
            try {
                session = createSession();
                Transaction transaction = session.beginTransaction();
                //Creando los detalles de Subcategorias
                for (int i = 0; i < subcategorias.size(); i++) {
                    ControlSubcategoryDetail csd = new ControlSubcategoryDetail();
                    ControlSubcategory cs = new ControlSubcategory();
                    //Crear el detalle con la categoria estatica y las subcategorias
                    //seleccionadas
                    csd.add(categoria, cs.selectOne(Integer.parseInt((String) subcategorias.get(i))));
                    System.gc();
                }
                //Si no ocurrio error hago comit y termino la session
                transaction.commit();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            } finally {
                session.flush();
                session.close();
            }
        } else {
            try {
                if (!categoria.getNombre().equals(selectOne(categoria.getIdcategoria()).getNombre())) {
                    Session session = createSession();
                    Transaction tx = session.beginTransaction();
                    //Operacion hibernate para borrar un registro
                    session.update(categoria);
                    //Si no ocurrio error hago comit y termino la session
                    tx.commit();
                    session.close();
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            }
        }
    }

    public void delete(int id) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();

            //Operacion hibernate para borrar un registro
            Categorias cat = new Categorias();
            cat.setIdcategoria(id);
            session.delete(cat);

            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
    }

    public void deleteByCategoria(Categorias cat) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            session.delete(cat);
            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
    }

    public Categorias getLast() {
        Categorias categoria;
        List lstcategoria;
        try {
            Session session;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            String consulta = "from Categorias order by idcategoria desc";
            lstcategoria = session.createQuery(consulta).setMaxResults(1).list();
            categoria = (Categorias) lstcategoria.get(0);
            session.flush();
            session.close();
            return categoria;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        }
    }

    public Session createSession() {

        Session session = null;
        try {
            //creando la nueva session para usar hibernate
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();

        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de categorias.", "Error al crear Session",
                    0);
            session.close();
        }
        return session;
    }
}
